/**
在 Node.js 中，使用  http  模块可以方便地发送 HTTP 请求。通过  http.request()  方法或  http.get()  方法，开发者可以向服务器发送请求并处理响应。
  1. 使用  http.request() 
  http.request()  方法用于发起 HTTP 请求，允许更多的配置选项。
   1.1 方法签名
  http.request(options, callback)
  - 参数:
    -  options : 一个对象，包含请求的配置选项，如  hostname 、 port 、 path 、 method 、 headers  等。
    -  callback : 处理响应的回调函数。

   1.2 示例
  const http = require('http');

  const options = {
      hostname: 'www.example.com',
      port: 80,
      path: '/',
      method: 'GET',
      headers: {
          'User-Agent': 'Node.js'
      }
  };

  const req = http.request(options, (res) => {
      console.log(状态码: ${res.statusCode});

      res.on('data', (chunk) => {
          console.log(响应体: ${chunk});
      });
  });

  req.on('error', (e) => {
      console.error(请求遇到问题: ${e.message});
  });

  // 结束请求
  req.end();
  2. 使用  http.get() 
  http.get()  方法是  http.request()  的简化版本，适用于发送 GET 请求。

   2.1 方法签名
  http.get(options, callback)
  - 参数:
    -  options : 请求的配置对象。
    -  callback : 处理响应的回调函数。

   2.2 示例
  const http = require('http');

  const options = {
      hostname: 'www.example.com',
      port: 80,
      path: '/',
      headers: {
          'User-Agent': 'Node.js'
      }
  };

  http.get(options, (res) => {
      console.log(状态码: ${res.statusCode});

      res.on('data', (chunk) => {
          console.log(响应体: ${chunk});
      });
  }).on('error', (e) => {
      console.error(请求遇到问题: ${e.message});
  });
  3. 发送 POST 请求
  发送 POST 请求时，需要在请求中包含请求体。可以通过  req.write()  方法写入数据。

   示例
  const http = require('http');

  const data = JSON.stringify({
      name: 'John Doe',
      age: 30
  });

  const options = {
      hostname: 'www.example.com',
      port: 80,
      path: '/api/user',
      method: 'POST',
      headers: {
          'Content-Type': 'application/json',
          'Content-Length': Buffer.byteLength(data)
      }
  };

  const req = http.request(options, (res) => {
      console.log(状态码: ${res.statusCode});

      res.on('data', (chunk) => {
          console.log(响应体: ${chunk});
      });
  });

  req.on('error', (e) => {
      console.error(请求遇到问题: ${e.message});
  });

  // 写入请求体
  req.write(data);
  // 结束请求
  req.end();
  4. 处理响应
  在处理响应时，通常需要监听  data  事件来获取响应体数据，并在  end  事件中处理完整的响应。

  5. 总结
  Node.js 的  http  模块提供了灵活的方式来发送 HTTP 请求。通过  http.request()  和  http.get()  方法，开发者可以方便地向服务器发送请求、处理响应，并支持多种请求类型（如 GET 和 POST）。掌握这些基本用法对于开发网络应用程序至关重要。
 */
const http = require("http");

// 1. 使用http模块发送GET请求
http.get("http://localhost:8080", (res) => {
  // 从可读流中获取数据
  res.on("data", (data) => {
    console.log(data.toString());
    const result = JSON.parse(data.toString());
    console.log(result);
  });
});

// 2. 使用http模块发送POST请求
const req = http.request(
  {
    method: "POST",
    hostname: "localhost",
    port: 8080,
  },
  (res) => {
    res.on("data", (data) => {
      const dataString = data.toString();
      const dataInfo = JSON.parse(dataString);
      console.log(dataInfo);
    });
  }
);

// 必须调用end, 表示写入内容完成
req.end();
